//
// Created by hsj on 2022/1/14.
//

#ifndef CLION_CPP_T_CLASS_CAST_H
#define CLION_CPP_T_CLASS_CAST_H
namespace my_class_cast{
/**
 * 最好是强制使用显示转换函数
 *
        static_cast	用于良性转换，一般不会导致意外发生，风险很低。
        const_cast	用于 const 与非 const、volatile 与非 volatile 之间的转换。
        reinterpret_cast 高度危险的转换，这种转换仅仅是对二进制位的重新解释，不会借助已有的转换规则对数据进行调整，但是可以实现最灵活的 C++ 类型转换。
        dynamic_cast	借助 RTTI（ Run-Time Type Identification），用于类型安全的向下转型（Downcasting）。
 */

//    测试类的转换（强转、自动转）
    void test_class_cast();

    class Stonewt{
        private:
            //亦可以static const unsigned int Lbs_per_stn = 14;
            //(避免枚举冲突，使用枚举类c++11)
            enum class SM:unsigned int{Lbs_per_stn = 14};
            int stone;
            double pds_left;
            //磅
            double pounds;
        public:
            //explicit关闭隐式转换（表示显示转换）
            //explicit Stonewt(double lbs);
            // Stonewt s;
            // s = 18.0;//(此时不可以)
            explicit Stonewt(double lbs);
            explicit Stonewt(int stn,double lbs);
            explicit Stonewt();
            ~Stonewt();
            void showLbs()const;
            void showStn()const;

            //转换函数：
            // 必须是类方法；
            // 不能指定返回值；
            // 不能有参数；
            explicit operator int()const;
            explicit operator double()const;
    };

}
#endif //CLION_CPP_T_CLASS_CAST_H
